/**
 * 
 */
package co.com.sed.model.peers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import co.com.sed.model.beans.Cargo;
import co.com.sed.model.beans.Funcionario;
import co.com.sed.model.beans.Sitio;
import co.com.sed.model.util.Util;

/**
 * @author MBarros
 * 
 */
public class FuncionarioPeer {

	private static final String BUSCAR_FUNCIONARIOS = "SELECT id_funcionario, identificacion, apellidos, nombres, fecha_nacimiento, direccion, ciudad, telefono, email, id_cargo, id_sitio "
			+ "FROM funcionario ";

	private static final String BUSCAR_FUNCIONARIOS_POR_NOMBRE = "SELECT id_funcionario, identificacion, apellidos, nombres, fecha_nacimiento, direccion, ciudad, telefono, email, id_cargo, id_sitio "
			+ "FROM funcionario "
			+ "WHERE nombres || ' ' || apellidos like '&nombreBuscar'";

	private static final String BUSCAR_FUNCIONARIOS_POR_SITIOS = "SELECT id_funcionario, identificacion, apellidos, nombres, fecha_nacimiento, direccion, ciudad, telefono, email, id_cargo, id_sitio "
			+ "FROM funcionario " + "WHERE id_sitio = &sitio";
	
	private static final String BUSCAR_FUNCIONARIOS_POR_ID = "SELECT id_funcionario, identificacion, apellidos, nombres, fecha_nacimiento, direccion, ciudad, telefono, email, id_cargo, id_sitio "
		+ "FROM funcionario " + "WHERE id_funcionario = &idBuscar";

	private static final String BUSCAR_FUNCIONARIO = "SELECT id_funcionario, identificacion, apellidos, nombres, fecha_nacimiento, direccion, ciudad, telefono, email, id_cargo, id_sitio "
			+ "FROM funcionario " + "WHERE id_funcionario = &idfuncionario";

	private static final String INSERTAR_FUNCIONARIO = "INSERT INTO funcionario(identificacion, apellidos, nombres, fecha_nacimiento, direccion, ciudad, telefono, email, id_cargo, id_sitio) VALUES "
			+ "('&identificacion', '&apellidos', '&nombres', '&fechaNacimiento', '&direccion', '&ciudad', '&telefono', '&email', &cargo, &sitio)";

	private static final String ACTUALIZAR_FUNCIONARIO = "UPDATE funcionario "
			+ "SET apellidos = '&apellidos', nombres = '&nombres', fecha_nacimiento = '&fechaNacimiento', direccion = '&direccion',"
			+ "ciudad='&ciudad', telefono='&telefono',email='&email', id_cargo=&cargo, id_sitio=&sitio"
			+ "WHERE id_funcionario = &idfuncionario";

	private static final String ELIMINAR_FUNCIONARIO = "DELETE FROM funcionario "
			+ "WHERE id_funcionario = &idfuncionario";

	/**
	 * busca en la base de datos todos los registros de la tabla "Funcionario"
	 * 
	 * @param stmt
	 *            referencia al Statement, pasado por DataManager para realizar
	 *            la consulta
	 * 
	 * @return lista de Funcionarios
	 * @see Funcionario, Statement
	 */

	public static ArrayList<Funcionario> buscarFuncionarios(Statement stmt) {
		ArrayList<Funcionario> Funcionarios = new ArrayList<Funcionario>();

		String sql = BUSCAR_FUNCIONARIOS;

		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Funcionario fun = new Funcionario();

					fun.setIdFuncionario(rs.getInt("id_funcionario"));
					fun.setIdentificacion(rs.getString("identificacion"));
					fun.setApellidos(rs.getString("apellidos"));
					fun.setNombres(rs.getString("nombres"));
					fun.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
					fun.setDireccion(rs.getString("direccion"));
					fun.setCiudad(rs.getString("ciudad"));
					fun.setTelefono(rs.getString("telefono"));
					fun.setEmail(rs.getString("email"));
					fun.setCargo(new Cargo(rs.getInt("id_cargo")));
					fun.setSitio(new Sitio(rs.getInt("id_sitio")));
					Funcionarios.add(fun);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("buscarFuncionarios():" + e.getMessage());
		}

		return Funcionarios;
	}

	/**
	 * Busca en la base de datos todos los registros de la tabla "Funcionario"
	 * 
	 * @param stmt
	 *            referencia al Statement, pasado por DataManager para realizar
	 *            la consulta
	 * 
	 * @return lista de Funcionarios
	 * @see Funcionario, Statement
	 */

	public static ArrayList<Funcionario> buscarFuncionariosPorNombre(
			Statement stmt, String nombres) {
		ArrayList<Funcionario> Funcionarios = new ArrayList<Funcionario>();

		String sql = BUSCAR_FUNCIONARIOS_POR_NOMBRE;
		ResultSet rs;
		sql = sql
				.replaceAll("&nombreBuscar", "%" + nombres.toUpperCase() + "%");
		Util.print("\nSQL (FuncionarioPeer) >> " + sql);

		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Funcionario fun = new Funcionario();
					fun.setIdFuncionario(rs.getInt("id_funcionario"));
					fun.setIdentificacion(rs.getString("identificacion"));
					Util.print("MAP >> id: " + rs.getInt("id_funcionario")
							+ " CC: " + rs.getString("identificacion"));
					fun.setApellidos(rs.getString("apellidos"));
					fun.setNombres(rs.getString("nombres"));
					fun.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
					fun.setDireccion(rs.getString("direccion"));
					fun.setCiudad(rs.getString("ciudad"));
					fun.setTelefono(rs.getString("telefono"));
					fun.setEmail(rs.getString("email"));
					fun.setCargo(new Cargo(rs.getInt("id_cargo")));
					fun.setSitio(new Sitio(rs.getInt("id_sitio")));
					Funcionarios.add(fun);
				}
			} catch (Exception e) {
				Util.print("rs.next() >> " + e.getMessage());
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("stmt.executeQuery(sql) >> " + e.getMessage());
		}
		return Funcionarios;
	}
		
	public static ArrayList<Funcionario> buscarFuncionariosPorId(
			Statement stmt, int id_fun) {
		ArrayList<Funcionario> Funcionarios = new ArrayList<Funcionario>();

		String sql = BUSCAR_FUNCIONARIOS_POR_ID;
		ResultSet rs;
		sql = sql
				.replaceAll("&idBuscar", "" + id_fun);
		Util.print("\nSQL (FuncionarioPeer) >> " + sql);

		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Funcionario fun = new Funcionario();
					fun.setIdFuncionario(rs.getInt("id_funcionario"));
					fun.setIdentificacion(rs.getString("identificacion"));
					Util.print("MAP >> id: " + rs.getInt("id_funcionario")
							+ " CC: " + rs.getString("identificacion"));
					fun.setApellidos(rs.getString("apellidos"));
					fun.setNombres(rs.getString("nombres"));
					fun.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
					fun.setDireccion(rs.getString("direccion"));
					fun.setCiudad(rs.getString("ciudad"));
					fun.setTelefono(rs.getString("telefono"));
					fun.setEmail(rs.getString("email"));
					fun.setCargo(new Cargo(rs.getInt("id_cargo")));
					fun.setSitio(new Sitio(rs.getInt("id_sitio")));
					Funcionarios.add(fun);
				}
			} catch (Exception e) {
				Util.print("rs.next() >> " + e.getMessage());
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("stmt.executeQuery(sql) >> " + e.getMessage());
		}
		return Funcionarios;
	}
	
	/**
	 * busca en la base de datos todos los registros de la tabla "Funcionario"
	 * que pertenezcan a Sitio
	 * 
	 * @param stmt
	 *            referencia al Statement, pasado por DataManager para realizar
	 *            la consulta
	 * 
	 * @return lista de Funcionarios
	 * @see Funcionario, Statement
	 */

	public static ArrayList<Funcionario> buscarFuncionariosPorSitios(
			Statement stmt, int id_sitio) {
		ArrayList<Funcionario> Funcionarios = new ArrayList<Funcionario>();

		String sql = BUSCAR_FUNCIONARIOS_POR_SITIOS;

		// se setean los "parametros"
		sql = sql.replaceAll("&sitio", "" + id_sitio);

		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Funcionario fun = new Funcionario();

					fun.setIdFuncionario(rs.getInt("id_funcionario"));
					fun.setIdentificacion(rs.getString("identificacion"));
					fun.setApellidos(rs.getString("apellidos"));
					fun.setNombres(rs.getString("nombres"));
					fun.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
					fun.setDireccion(rs.getString("direccion"));
					fun.setCiudad(rs.getString("ciudad"));
					fun.setTelefono(rs.getString("telefono"));
					fun.setEmail(rs.getString("email"));
					fun.setCargo(new Cargo(rs.getInt("id_cargo")));
					fun.setSitio(new Sitio(rs.getInt("id_sitio")));

					Funcionarios.add(fun);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("buscarFuncionariosPorSitios(): " + e.getMessage());
		}

		return Funcionarios;
	}

	/**
	 * busca en la base de datos un registro de la tabla "funcionario"
	 * 
	 * @param stmt
	 *            referencia al Statement, pasado por DataManager para realizar
	 *            la consulta
	 * @param funcionario
	 *            id de Funcionario que se desea cosultar
	 * 
	 * @return funcionario buscado
	 * @see Funcionario, Statement
	 */

	public static Funcionario buscarFuncionario(Statement stmt,
			int id_funcionario) {
		Funcionario fun = new Funcionario();

		String sql = BUSCAR_FUNCIONARIO;

		// se setean los "parametros"
		sql = sql.replaceAll("&idfuncionario", "" + id_funcionario);

		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				if (rs.next()) {

					fun.setIdentificacion(rs.getString("identificacion"));
					fun.setApellidos(rs.getString("apellidos"));
					fun.setNombres(rs.getString("nombres"));
					fun.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
					fun.setDireccion(rs.getString("direccion"));
					fun.setCiudad(rs.getString("ciudad"));
					fun.setTelefono(rs.getString("telefono"));
					fun.setEmail(rs.getString("email"));
					fun.setCargo(new Cargo(rs.getInt("id_cargo")));
					fun.setSitio(new Sitio(rs.getInt("id_sitio")));
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("buscarFuncionario(): " + e.getMessage());
		}

		return fun;
	}

	/**
	 * Inserta un Tipo de Funcionario en la base de datos
	 * 
	 * @param stmt
	 *            referencia al Statement, pasado por DataManager para ejecutar
	 *            la sentencia
	 * @param funcionario
	 *            funcionario que se va a insertar en la base de datos
	 * 
	 * @return void
	 * @throws SQLException
	 *             si ocurre un error al insertar el registro en la base de
	 *             datos
	 * 
	 * @see DataManager
	 */

	public static int insertarFuncionario(Statement stmt,
			Funcionario funcionario) throws SQLException {

		int idNuevoFuncionario = -1;
		ResultSet rs = null;

		try {
			String sql = INSERTAR_FUNCIONARIO;

			Util.print("................Insertando Foncionario...........");
			Util.print("Identificacion: " + funcionario.getIdentificacion());
			Util.print("Apellidos: " + funcionario.getApellidos());
			Util.print("Nombres: " + funcionario.getNombres());
			Util.print("FechaNacimiento: " + funcionario.getFechaNacimiento());
			Util.print("Direccion: " + funcionario.getDireccion());
			Util.print("Ciudad: " + funcionario.getCiudad());
			Util.print("Telefono: " + funcionario.getTelefono());
			Util.print("Email: " + funcionario.getEmail());
			Util.print("Cargo: " + funcionario.getCargo().getIdCargo());
			Util.print("Sitio: " + funcionario.getSitio().getIdSitio());

			sql = sql
					.replaceAll("&identificacion",
							"" + funcionario.getIdentificacion())
					.replaceAll("&apellidos", "" + funcionario.getApellidos())
					.replaceAll("&nombres", "" + funcionario.getNombres())
					.replaceAll("&fechaNacimiento",
							"" + funcionario.getFechaNacimiento())
					.replaceAll("&direccion", "" + funcionario.getDireccion())
					.replaceAll("&ciudad", "" + funcionario.getCiudad())
					.replaceAll("&telefono", "" + funcionario.getTelefono())
					.replaceAll("&email", "" + funcionario.getEmail())
					.replaceAll("&cargo",
							"" + funcionario.getCargo().getIdCargo())
					.replaceAll("&sitio",
							"" + funcionario.getSitio().getIdSitio());

			// se setean los "parametros": &identificacion, &apellido, &nombre,
			// &fechaNacimiento, &direccion, &ciudad, &telefono, &email, &cargo,
			// &sitio

			stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
			rs = stmt.getGeneratedKeys();
			if (rs.next()) {
				idNuevoFuncionario = rs.getInt("id_funcionario");
				Util.print("\nNuevo registro (id_funcionario): "
						+ idNuevoFuncionario);
			}
		} catch (Exception e) {
			Util.print("\n------------------>" + e.getMessage());
		} finally {
			rs.close();
		}

		return idNuevoFuncionario;
	}

	/**
	 * Actualiza un Funcionario en la base de datos
	 * 
	 * @param stmt
	 *            referencia al Statement, pasado por DataManager para ejecutar
	 *            la sentencia
	 * @param funcionario
	 *            funcionario que se va a actualizar en la base de datos
	 * 
	 * @return void
	 * @throws SQLException
	 *             si ocurre un error al actualizar el registro en la base de
	 *             datos
	 * 
	 * @see DataManager
	 */

	public static void actualizarFuncionario(Statement stmt,
			Funcionario funcionario) throws SQLException {
		String sql = ACTUALIZAR_FUNCIONARIO;
		// se setean los "parametros": &id_empleado, &id_persona,&telefono,
		// &email, &fecha_ingreso
		sql = sql
				.replaceAll("&identificacion",
						"" + funcionario.getIdentificacion())
				.replaceAll("&apellidos", "" + funcionario.getApellidos())
				.replaceAll("&nombres", "" + funcionario.getNombres())
				.replaceAll("&fechaNacimiento",
						Util.sqlFormatDate(funcionario.getFechaNacimiento()))
				.replaceAll("&direccion", "" + funcionario.getDireccion())
				.replaceAll("&ciudad", "" + funcionario.getCiudad())
				.replaceAll("&telefono", "" + funcionario.getTelefono())
				.replaceAll("&email", "" + funcionario.getEmail())
				.replaceAll("&cargo", "" + funcionario.getCargo().getIdCargo())
				.replaceAll("&sitio", "" + funcionario.getSitio().getIdSitio());

		stmt.executeUpdate(sql);
	}

	/**
	 * Elimina un Funcionario en la base de datos
	 * 
	 * @param stmt
	 *            referencia al Statement, pasado por DataManager para ejecutar
	 *            la sentencia
	 * @param funcionario
	 *            funcionario que se va a eliminar en la base de datos
	 * 
	 * @return void
	 * @throws SQLException
	 *             si ocurre un error al eliminar el registro en la base de
	 *             datos
	 * 
	 * @see DataManager
	 */

	public static void eliminarFuncionario(Statement stmt,
			Funcionario funcionario) throws SQLException {
		String sql = ELIMINAR_FUNCIONARIO;
		// se setean los "parametros": &identificacion
		sql = sql.replaceAll("&identificacion",
				"" + funcionario.getIdentificacion());

		stmt.executeUpdate(sql);
	}

}
